// FocusMachineModel.h
#ifndef FOCUS_MACHINE_MODEL_H
#define FOCUS_MACHINE_MODEL_H


#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QObject>
#include <QDebug>
#include <QThread>
#include <QElapsedTimer>
#include <QCoreApplication>
#include <QTimer>

class FocusMachineModel : public QObject {
    Q_OBJECT

public:
    FocusMachineModel(const QString &clientName = "DefaultClient");
    ~FocusMachineModel();

    void setupModbusClient(const QString &ip, int port);
    bool connectToModbusServer();
    void disconnectFromModbusServer();
    bool readModbusFloat(int address, float &value, int timeout = 3000);
    bool writeModbusFloat(int address, float value, int timeout = 3000);
    bool readModbusRegister(int address, int16_t &value, int timeout = 3000);
    bool writeModbusRegister(int address, int16_t value, int timeout = 3000);
    void waitForRegisterValue(int address, int16_t expectedValue);
    void cancelWait(); // 新增: 取消等待的方法

    // 新增: 一次性读取当前坐标的方法
    bool readCurrentCoordinates(int address, float &x, float &y, float &z, int timeout = 3000);

    // 新增: 一次性写入目标移动量的方法
    bool writeTargetMoveValue(int address, float x = 0.0f, float y = 0.0f, float z = 0.0f, int timeout = 3000);

    void setEndianness(bool bigEndian); // 新增：设置大小端模式的方法

    bool isConnected() const;

    QString getClientName() const { return m_clientName; }

    // 新增: 错误处理相关方法
    QString getLastError() const;
    void clearError();
    bool hasError() const;
    bool reconnect(int retries = 3, int delay = 1000);

    void startConnectionMonitoring();
    void stopConnectionMonitoring();

signals:
    void registerValueChanged(int address, int16_t value);
    void errorOccurred(const QString &errorMessage);
    void reconnectAttempt(int attempt, int maxAttempts);
    void reconnectSucceeded();
    void reconnectFailed();

private:
    QModbusTcpClient *modbusClient = nullptr;
    bool shouldCancelWait; // 新增: 用于标记是否应该取消等待
    bool isBigEndian; // 新增：控制大小端模式
    QString m_clientName;

    // 新增: 辅助方法,用于将两个16位整数转换为一个浮点数
    float convertToFloat(uint16_t low, uint16_t high);

    // 新增: 辅助方法,用于将一个浮点数转换为两个16位整数
    void convertFloatToUint16(float value, uint16_t &low, uint16_t &high);
    void MySleep(uint32_t ms);
    bool MySleep(uint32_t ms, bool *value);

    // 新增: 错误处理相关成员
    QString m_lastError;
    int m_errorCount;
    static const int MAX_ERRORS = 5;

    // 新增: 错误处理辅助方法
    void setError(const QString &error);
    bool handleCommunicationError();

    QTimer *m_connectionMonitorTimer;
    int m_reconnectAttempts;
    static const int MAX_RECONNECT_ATTEMPTS = 5;
    static const int RECONNECT_INTERVAL = 5000; // 5秒

    void checkConnection();
    void attemptReconnect();
};

#endif // FOCUS_MACHINE_MODEL_H
